#!/bin/bash

# 项目名称
projectName=
# 项目端口
projectPort=8080
# 分支名称
branchName=develop
# 容器名称
containerName=
# 数据目录
dataDir=/data
# 项目路径
projectPath=
# 容器中项目日志文件目录
containerProjectLogDir=${dataDir}/log
# 配置文件目录名称
configDirName=config
# 日志目录名称
logDirName=log
# Tomcat日志目录名称
tomcatLogDirName=tomcatlog
# 网页应用目录名称
webappDirName=webapps
# .properties文件名称
propertiesFileName=application.properties
# 日志配置文件名称
logConfigFileName=

# 容器工作目录
containerWorkDir=/usr/local/tomcat

# 创建目录
function createDirectory() {
    # 目录名称
    dirName=$1
	# 目录不存在则创建
    if [[ ! -d ${dirName} ]]; then
        mkdir -p ${dirName}
    fi
}

# 创建文件
function createFile() {
    # 文件名称
    fileName=$1
    # 文件不存在则创建
    if [[ ! -f ${fileName} ]]; then
        touch ${fileName}
    fi
}

# 初始化
function init() {
    # 项目路径为空串时，设置默认项目路径
    if [[ -z "${projectPath}" ]] ; then
        projectPath=${dataDir}/code/${projectName}/${projectName}
    fi

    # 项目配置文件目录
    projectConfigDir=${dataDir}/${configDirName}/${projectName}
    # 项目Resources目录
    projectResourcesDir=${projectPath}/src/main/resources
    # 项目日志目录
    projectLogDir=${dataDir}/${logDirName}/${projectName}
    # Tomcat日志目录
    tomcatLogDir=${dataDir}/${tomcatLogDirName}/${projectName}
    # Tomcat日志文件
    tomcatLogFile=${tomcatLogDir}/catalina.`date '+%Y-%m-%d'`.log
    # 网页应用目录
    webappsDir=${dataDir}/${webappDirName}/${projectName}

    # 创建项目配置文件目录
    createDirectory ${projectConfigDir}
    # 创建项目日志目录
    createDirectory ${projectLogDir}
    # 创建Tomcat日志目录
    createDirectory ${tomcatLogDir}
    # 创建Tomcat日志文件
    createFile ${tomcatLogFile}
    # 创建应用目录
    createDirectory ${webappsDir}
}

# Git拉取代码
function gitPull() {
    # 进入项目目录
    cd ${projectPath}
    # 重置代码至远程的当前分支
    git reset --hard origin/`git branch | grep \* | cut -d ' ' -f2`
    # 切换分支
    git checkout ${branchName}
    # 拉取代码
    git pull
}

# 复制配置文件
function copyConfigFile() {
    if [[ -n "${propertiesFileName}" ]] ; then
        \cp -f ${projectConfigDir}/${propertiesFileName} ${projectResourcesDir}/application.properties
    elif [[ -n "${logConfigFileName}" ]] ; then
        \cp -f ${projectConfigDir}/${logConfigFileName} ${projectResourcesDir}/
    else
        # 复制配置文件（文件存在则静默覆盖）
        \cp -f ${projectConfigDir}/* ${projectResourcesDir}/
    fi
}

# Maven打包前需要执行的操作
function mavenPackageBefore() {
    echo > /dev/null
}

# Maven打包
function mavenPackage() {
    # 复制配置文件
    copyConfigFile
    # Maven打包前需要执行的操作
    mavenPackageBefore
    # 进入项目目录
    cd ${projectPath}
    # Maven打包
    mvn clean package -Dmaven.test.skip=true
}

# 更新ROOT.war
function updateWar() {
    rm -rf ${webappsDir}/ROOT*
    cp ${projectPath}/target/${projectName}.war ${webappsDir}/ROOT.war
}

# 移除容器
function removeContainer() {
    docker ps -a | grep ${containerName} &> /dev/null
    # 上一条命令执行成功则返回0，即容器存在
    if [[ $? -eq 0 ]]; then
        docker rm -f ${containerName}
    fi
}

# 运行容器
function runContainer() {
    # 移除容器
    removeContainer
    # 运行容器
    docker run \
    -idt \
    --name ${containerName} \
    --rm \
    -p ${projectPort}:8080 \
    -v ${webappsDir}:${containerWorkDir}/webapps \
    -v ${tomcatLogDir}:${containerWorkDir}/logs \
    -v ${projectLogDir}:${containerProjectLogDir}\
    tomcat
}

# 输出部署时间至文件
function outputDeployTimeToFile() {
    echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)" >> ${dataDir}/deploy_${containerName}.log
}

# 输出Tomcat日志
function outputTomcatLog() {
    tail -f ${tomcatLogFile}
}

# 部署
function deploy() {
    # 初始化
    init
    # 拉取代码
    gitPull
    # 打包
    mavenPackage
    # 更新ROOT.war
    updateWar
    # 输出部署时间至文件
    outputDeployTimeToFile
    # 运行容器
    runContainer
    # 输出Tomcat日志
    outputTomcatLog
}

